Preprocessing: Apprendre a préparer un data set avant de construire le model de ML. Dans cette section nous allons :
1- Importer les librairies
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
2- Importer le data set puis extraire la matrice des variables dépendantes et le vecteur des de la variable indépendante
# Importer le data set
dataset = pd.read_csv('Data.csv')
dataset.head()
| Country | Age | Salary | Purchased | |
|---|---|---|---|---|
| 0 | France | 44.0 | 72000.0 | No |
| 1 | Spain | 27.0 | 48000.0 | Yes |
| 2 | Germany | 30.0 | 54000.0 | No |
| 3 | Spain | 38.0 | 61000.0 | No |
| 4 | Germany | 40.0 | NaN | Yes |
3- Extraire les predicteurs et la cible
# extraire la matrice des variables indépendantes et le vecteur des de la variable dépendante
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values
X
array([['France', 44.0, 72000.0],
['Spain', 27.0, 48000.0],
['Germany', 30.0, 54000.0],
['Spain', 38.0, 61000.0],
['Germany', 40.0, nan],
['France', 35.0, 58000.0],
['Spain', nan, 52000.0],
['France', 48.0, 79000.0],
['Germany', 50.0, 83000.0],
['France', 37.0, 67000.0]], dtype=object)
y
array(['No', 'Yes', 'No', 'No', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes'],
dtype=object)
3- # Gérer les données manquantes
dataset.dtypes
Country object Age float64 Salary float64 Purchased object dtype: object
# importer la classe Imputer
from sklearn.impute import SimpleImputer
# instancier la classe SimpleImputer en précisant la stratégie d'imputation
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
# Lier l'objet imputer aux colonnes de X à imputer
imputer.fit(X[:, 1:3])
SimpleImputer()In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
SimpleImputer()
# remplacer les valeurs manquantes par la moyenne des colonnes
X[:, 1:3] = imputer.transform(X[:, 1:3])
# imputer.fit_transform(X, fit_params) Mieux !!!
X
array([['France', 44.0, 72000.0],
['Spain', 27.0, 48000.0],
['Germany', 30.0, 54000.0],
['Spain', 38.0, 61000.0],
['Germany', 40.0, 63777.77777777778],
['France', 35.0, 58000.0],
['Spain', 38.77777777777778, 52000.0],
['France', 48.0, 79000.0],
['Germany', 50.0, 83000.0],
['France', 37.0, 67000.0]], dtype=object)
4- # Gérer les variables catégoriques ;
Pourquoi ? : Les modelés ML sont basés sur des équations mathématiques qui implémentent difficilement les variables non numériques
dataset.dtypes
Country object Age float64 Salary float64 Purchased object dtype: object
# importer les classes LabelEncoder et OneHotEncoder
from sklearn.preprocessing import LabelEncoder ,OneHotEncoder
from sklearn.compose import ColumnTransformer
X[:, 0]
array(['France', 'Spain', 'Germany', 'Spain', 'Germany', 'France',
'Spain', 'France', 'Germany', 'France'], dtype=object)
# creer une instance de LabelEncoder pour la variable categorique de X
labelencoder_X = LabelEncoder()
# fiter et transformer sur la colonne a transformer. il transforme la variable
#catégorique a trois niveau en valeurs numérique 0 - 1- 2 pour utiliser OneHotEncoder
#qui ne travail qu’avec des variables numériques
X[:, 0] = labelencoder_X.fit_transform(X[:, 0])
X[:, 0]
array([0, 2, 1, 2, 1, 0, 2, 0, 1, 0], dtype=object)
# instancier OneHotEncoder pour l'encodager sous forme de demie variable 0 entre crocher pour l'indice la/des colonnes a encoder
columntransformer = ColumnTransformer([("Country",OneHotEncoder(),[0])],remainder='passthrough')
# fiter puis transformer
X = columntransformer.fit_transform(X)
X
array([[1.0, 0.0, 0.0, 44.0, 72000.0],
[0.0, 0.0, 1.0, 27.0, 48000.0],
[0.0, 1.0, 0.0, 30.0, 54000.0],
[0.0, 0.0, 1.0, 38.0, 61000.0],
[0.0, 1.0, 0.0, 40.0, 63777.77777777778],
[1.0, 0.0, 0.0, 35.0, 58000.0],
[0.0, 0.0, 1.0, 38.77777777777778, 52000.0],
[1.0, 0.0, 0.0, 48.0, 79000.0],
[0.0, 1.0, 0.0, 50.0, 83000.0],
[1.0, 0.0, 0.0, 37.0, 67000.0]], dtype=object)
# instancier LabelEncoder pour y
labelencoder_y = LabelEncoder()
# fiter et transformer
y = labelencoder_y.fit_transform(y)
y
array([0, 1, 0, 0, 1, 1, 0, 1, 0, 1])
# Diviser le dataset entre le Training set et le Test set
# importer la fonction train_test_split
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)
X_train
array([[0.0, 1.0, 0.0, 40.0, 63777.77777777778],
[1.0, 0.0, 0.0, 37.0, 67000.0],
[0.0, 0.0, 1.0, 27.0, 48000.0],
[0.0, 0.0, 1.0, 38.77777777777778, 52000.0],
[1.0, 0.0, 0.0, 48.0, 79000.0],
[0.0, 0.0, 1.0, 38.0, 61000.0],
[1.0, 0.0, 0.0, 44.0, 72000.0],
[1.0, 0.0, 0.0, 35.0, 58000.0]], dtype=object)
X_test
array([[0.0, 1.0, 0.0, 30.0, 54000.0],
[0.0, 1.0, 0.0, 50.0, 83000.0]], dtype=object)
y_train
array([1, 1, 1, 0, 1, 0, 0, 1])
y_test
array([0, 0])
6- mise à l'echelle
# pour le feature scaling importons la classe StandardScaler
from sklearn.preprocessing import StandardScaler
# instancier StandardScaler
sc = StandardScaler()
# fiter et transformer le training et le test set
X_train = sc.fit_transform(X_train)
X_test = sc.fit_transform(X_test)
X_train
array([[-1. , 2.64575131, -0.77459667, 0.26306757, 0.12381479],
[ 1. , -0.37796447, -0.77459667, -0.25350148, 0.46175632],
[-1. , -0.37796447, 1.29099445, -1.97539832, -1.53093341],
[-1. , -0.37796447, 1.29099445, 0.05261351, -1.11141978],
[ 1. , -0.37796447, -0.77459667, 1.64058505, 1.7202972 ],
[-1. , -0.37796447, 1.29099445, -0.0813118 , -0.16751412],
[ 1. , -0.37796447, -0.77459667, 0.95182631, 0.98614835],
[ 1. , -0.37796447, -0.77459667, -0.59788085, -0.48214934]])
X_test
array([[ 0., 0., 0., -1., -1.],
[ 0., 0., 0., 1., 1.]])
Formateur - M ASSOHOUN E Stanislas